/**
 * Created by Administrator on 2016/11/18.
 */
var mongo = require('./db');
//引入markdown插件
var markdown = require('markdown').markdown;

function Post(name,title,tags,post) {
    //发布人，标题，内容
    this.name = name; //.replace(/</g,'&lt;').replace(/>/,'&gt;');
    this.title = title;
    //接受一下标签信息
    this.tags =tags;
    //XSS跨站脚本攻击的预防
    this.post =post; //.replace(/</g,'&lt;').replace(/>/,'&gt;');

}
module.exports = Post;
//保存文章
Post.prototype.save = function (callback) {

    var date = new Date();
    //保存当前时间的各种格式
    var time ={
        date:date,
        year:date.getFullYear(),
        month:date.getFullYear() + '-'  + (date.getMonth() + 1),
        day:date.getFullYear() + '-'  + (date.getMonth() + 1) +'-' + date.getDate(),
        hour:date.getFullYear() + '-'  + (date.getMonth() + 1) +'-' + date.getDate() +'-' + date.getHours(),
        minute:date.getFullYear() + '-'  + (date.getMonth() + 1) +'-' + date.getDate() +'-' + date.getHours() + '-' +date.getMinutes() +':' +date.getSeconds()
    };
    //我们要保存的数据
    var post ={
        name:this.name,
        time:time,
        title:this.title,
        //接受一下标签信息
        tags:this.tags,
        post:this.post,
        //新增的留言字段
        comments: [],
        //新增的访问量
        pv:0
    };
    //打开数据库
    mongo.open(function (err,db) {
        if(err){
            return callback(err);
        }
        db.collection('posts',function (err,collection) {
            if(err){
                mongo.close();
                return callback(err);
            }
            collection.insert(post,{safe:true},function (err) {
                mongo.close();
                if(err){
                    return callback(err);
                }
                //如果没有错误的情况下，不给提示错误提示
                callback(null);
            })
        })
    })
};
//获取文章,获取该上传者十篇文章
Post.getTen = function(name, page, callback) {
    //打开数据库
    mongo.open(function (err, db) {
        if (err) {
            return callback(err);
        }
        //读取 posts 集合
        db.collection('posts', function (err, collection) {
            if (err) {
                mongo.close();
                return callback(err);
            }
            var query = {};
            if (name) {
                query.name = name;
            }
            //使用 count 返回特定查询的文档数 total
            collection.count(query, function (err, total) {
                //根据 query 对象查询，并跳过前 (page-1)*10 个结果，返回之后的 10 个结果
                collection.find(query, {
                    skip: (page - 1)*5,
                    limit: 5
                }).sort({
                    time: -1
                }).toArray(function (err, docs) {
                    mongo.close();
                    if (err) {
                        return callback(err);
                    }

                    //解析 markdown 为 html
                    docs.forEach(function (doc) {
                        doc.post = markdown.toHTML(doc.post);
                    });
                    callback(null, docs, total);
                });
            });
        });
    });
};
//可以根据用户名，发布时间，文章标题，来查询某一篇具体的文章
Post.getOne = function (name,minute,title,callback) {
    mongo.open(function (err,db) {
        if(err){
            return callback(err);
        }
        db.collection('posts',function (err,collection) {
            if(err){
                mongo.close();
                return callback(err);
            }
            collection.findOne({
                "name":name,
                "time.minute":minute,
                "title":title
            },function (err,doc) {

                if(err){
                    mongo.close();
                    return callback(err);
                }
                //增加访问量的代码
                if(doc){
                    collection.update({
                        "name":name,
                        "time.minute":minute,
                        "title":title
                    },{
                        $inc:({'pv':1})
                    },function (err) {
                        mongo.close();
                        if(err){
                            return callback(err);
                        }
                    })
                }
                //markdown解析一下，comments
                if(doc) {
                    doc.post = markdown.toHTML(doc.post);
                    doc.comments.forEach(function (comment) {
                        //把留言的内容用markdown解析一下
                        comment.content = markdown.toHTML(comment.content);
                    });
                }
                callback(null,doc);
            })
        })
    })
};
//为文章添加编辑和删除功能，发返回markdown格式的原始内容
Post.edit = function (name,minute,title,callback) {
    mongo.open(function (err,db) {
        if(err){
            return callback(err);
        }
        db.collection('posts',function (err,collection) {
            if(err){
                mongo.close();
                return callback(err);
            }
            collection.findOne({
                "name":name,
                "time.minute":minute,

                "title":title

            }, function (err,doc) {
                mongo.close();
                if (err) {
                    return callback(err);
                }
                //返回查询的一篇文章（markdown 格式）
                callback(null, doc);
            })
        })
      })
};
//修改操作
Post.update =function (name,minute,title,post,callback) {
         mongo.open(function (err,db) {
             if(err){
                 return callback(err);

             }
             db.collection('posts',function (err,collection) {
                 if(err){
                     mongo.close();
                     return callback(err);
                 }
                 collection.update({
                     "name":name,
                     "title":title,
                     "time.minute":minute
                 },{$set:{post:post}},function (err) {
                     mongo.close();
                     if(err){
                         return callback(err);
                     }
                     callback(null);
                 })
             })
         })
};
//删除操作
Post.remove = function (name,minute,title,callback) {
    mongo.open(function (err,db) {
        if(err){
            return callback(err);
        }
        db.collection('posts', function (err, collection) {
            if (err) {
                mongo.close();
                return callback(err);
            }
            collection.remove({
                "name": name,
                "title": title,
                "time.minute": minute
            }, {
                w: 1
            }, function (err) {
                mongo.close();
                if (err) {
                    return callback(err);
                }
                callback(null);
            })
        })
    })
};
//返回所有文章存档信息
Post.getArchive = function(callback) {
    //打开数据库
    mongo.open(function (err, db) {
        if (err) {
            return callback(err);
        }
        //读取 posts 集合
        db.collection('posts', function (err, collection) {
            if (err) {
                mongo.close();
                return callback(err);
            }
            //返回只包含 name、time、title 属性的文档组成的存档数组
            collection.find({}, {
                "name": 1,
                "time": 1,
                "title": 1
            }).sort({
                time: -1
            }).toArray(function (err, docs) {
                mongo.close();
                if (err) {
                    return callback(err);
                }
                callback(null, docs);
            });
        });
    });
};
//返回所有标签
Post.getTags = function(callback) {
    mongo.open(function (err,db) {
        if (err) {
            return callback(err);
        }
        db.collection('posts', function (err,collection) {
            if (err) {
                mongo.close();
                return callback(err);
            }
            //distinct 用来找出给定键的所有不同值
            collection.distinct("tags", function (err,docs) {
                mongo.close();
                if (err) {
                    return callback(err);
                }
                callback(null,docs);
            });
        });
    });
};
//获取标签所对应的文章
Post.getTag = function (tag,callback) {
    mongo.open(function (err,db) {
        if(err){
            return callback(err);
        }
        db.collection('posts',function (err,collection) {
            if(err){
                mongo.close();
                return callback(err);
            }
            collection.find({
                "tags":tag
            }).sort({
                time:-1
            }).toArray(function (err,docs) {
                mongo.close();
                if(err){
                    return callback(err);
                }
                callback(null,docs);
            })
        })
    })
};
//搜索功能
Post.search =function (keyword,callback) {
    mongo.open(function (err,db) {
        if(err){
            return callback(err);
        }
        db.collection('posts',function (err,collection) {
            if(err){
                mongo.close();
                return callback(err);
            }
            var pattern = new RegExp(keyword,'i');
            collection.find({
                "title":pattern
            },{
                "name":1,
                "time":1,
                "title":1
            }).sort({
                time:-1
            }).toArray(function (err,docs) {
                mongo.close();
                if(err){
                    return callback(err);
                }
                callback(null,docs);
            })
        })
    })
};